#ifndef TRANSPORTADT_H_
#define TRANSPORTADT_H_

//tamaño maximo de los mensajes que podran ser enviados y recibidos.
#define MSG_LEN 20

typedef struct transportCDT * transportADT;

/**
 * Abre el transporte usando el id recibido como clave. Debe ser
 * usada antes de la funcion getTrans.
 *
 * @param[in]	id		Clave usada para inicializar el transporte.
 *
 * @return				Retorna una estructura transportADT que debera ser
 * 						pasada como parametro a todas las funciones de
 * 						la capa de transporte.
 */
transportADT openTrans(void * id);

/**
 * Se conecta al transporte indicado por el parametro dest. Debe ser usada
 * despues de que se haya abierto un nuevo transporte con la funcion openTrans
 *
 * @param[in]	id		Clave usada para representar al proceso que llama
 * 						a la funcion.
 * @param[in]	dest	Clave del transporte con el que se desea comunicar.
 *
 * @return				Retorna una estructura transportADT que debera ser
 * 						pasada como parametro a todas las funciones de
 * 						la capa de transporte.
 */
transportADT getTrans(void * id, void * dest);


/**
 * Recibe un mensaje de tamaño maximo size y guarda la direccion del proceso
 * que envio el mensaje, para poder responder.
 *
 * @param[in]	trans	Estructura de transporte.
 * @param[out]	buf		Buffer con suficiente tamaño para guardar el mensaje.
 * @param[in]	size	Tamaño maximo para guardar el mensaje en buf.
 *
 * @return				Retorna la cantidad de bytes recibidos, o -1 en caso
 * 						de error.
 */
int readMsg(transportADT trans, void * buf, int size);

/**
 * Envia un mensaje de tamaño size al destino guardado en el ultimo readMsg
 * realizado, o al destino seteado en getTrans si no se realizo ningun readMsg.
 *
 * @param[in]	trans	Estructura de transporte.
 * @param[in]	buf		Buffer con el mensaje a enviar.
 * @param[in]	size	Tamaño del mensaje guardado en buf.
 *
 * @return				Retorna la cantidad de bytes enviados, o -1 en caso
 * 						de error.
 */
int writeMsg(transportADT trans, const void * buf, int size);

/**
 * Cierra el transporte. No se debe seguir usando la estructura trans una vez
 * cerrado el transporte.
 *
 * @param[in]	trans	Estructura de transporte.
 *
 */
void closeTrans(transportADT trans);

#endif /* TRANSPORTADT_H_ */
